/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package br.puc.molic.provider;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

import br.puc.molic.util.MolicAdapterFactory;

/**
 * This is the factory that is used to provide the interfaces needed to support Viewers.
 * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
 * The adapters also support Eclipse property sheets.
 * Note that most of the adapters are shared among multiple instances.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class MolicItemProviderAdapterFactory extends MolicAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static final String copyright = "MoLIC Designer (c) 2009 \nThis software is part of the MSc work of Ugo Braga Sangiorgi and can be copied freely\n\nDeveloped at Semiotic Engineering Research Lab (SERG)\nPontifical Catholic University of Rio de Janeiro, PUCRio\n\nAuthor: Ugo Braga Sangiorgi - usangiorgi@inf.puc-rio.br";

	/**
	 * This keeps track of the root adapter factory that delegates to this adapter factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ComposedAdapterFactory parentAdapterFactory;

	/**
	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected IChangeNotifier changeNotifier = new ChangeNotifier();

	/**
	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Collection<Object> supportedTypes = new ArrayList<Object>();

	/**
	 * This constructs an instance.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MolicItemProviderAdapterFactory() {
		supportedTypes.add(IEditingDomainItemProvider.class);
		supportedTypes.add(IStructuredItemContentProvider.class);
		supportedTypes.add(ITreeItemContentProvider.class);
		supportedTypes.add(IItemLabelProvider.class);
		supportedTypes.add(IItemPropertySource.class);
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.Diagram} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected DiagramItemProvider diagramItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.Diagram}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createDiagramAdapter() {
		if (diagramItemProvider == null) {
			diagramItemProvider = new DiagramItemProvider(this);
		}

		return diagramItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.Scene} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected SceneItemProvider sceneItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.Scene}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createSceneAdapter() {
		if (sceneItemProvider == null) {
			sceneItemProvider = new SceneItemProvider(this);
		}

		return sceneItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.Utterance} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UtteranceItemProvider utteranceItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.Utterance}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createUtteranceAdapter() {
		if (utteranceItemProvider == null) {
			utteranceItemProvider = new UtteranceItemProvider(this);
		}

		return utteranceItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.SystemProcess} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected SystemProcessItemProvider systemProcessItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.SystemProcess}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createSystemProcessAdapter() {
		if (systemProcessItemProvider == null) {
			systemProcessItemProvider = new SystemProcessItemProvider(this);
		}

		return systemProcessItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.BRTUtterance} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected BRTUtteranceItemProvider brtUtteranceItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.BRTUtterance}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createBRTUtteranceAdapter() {
		if (brtUtteranceItemProvider == null) {
			brtUtteranceItemProvider = new BRTUtteranceItemProvider(this);
		}

		return brtUtteranceItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.UbiquitousAccess} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UbiquitousAccessItemProvider ubiquitousAccessItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.UbiquitousAccess}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createUbiquitousAccessAdapter() {
		if (ubiquitousAccessItemProvider == null) {
			ubiquitousAccessItemProvider = new UbiquitousAccessItemProvider(this);
		}

		return ubiquitousAccessItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.OpeningPoint} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected OpeningPointItemProvider openingPointItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.OpeningPoint}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createOpeningPointAdapter() {
		if (openingPointItemProvider == null) {
			openingPointItemProvider = new OpeningPointItemProvider(this);
		}

		return openingPointItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.ClosingPoint} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ClosingPointItemProvider closingPointItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.ClosingPoint}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter createClosingPointAdapter() {
		if (closingPointItemProvider == null) {
			closingPointItemProvider = new ClosingPointItemProvider(this);
		}

		return closingPointItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link br.puc.molic.Sketch} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected SketchItemProvider sketchItemProvider;

	/**
	 * This creates an adapter for a {@link br.puc.molic.Sketch}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createSketchAdapter() {
		if (sketchItemProvider == null) {
			sketchItemProvider = new SketchItemProvider(this);
		}

		return sketchItemProvider;
	}

	/**
	 * This returns the root adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ComposeableAdapterFactory getRootAdapterFactory() {
		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
	}

	/**
	 * This sets the composed adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
		this.parentAdapterFactory = parentAdapterFactory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public boolean isFactoryForType(Object type) {
		return supportedTypes.contains(type) || super.isFactoryForType(type);
	}

	/**
	 * This implementation substitutes the factory itself as the key for the adapter.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Adapter adapt(Notifier notifier, Object type) {
		return super.adapt(notifier, this);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
    public Object adapt(Object object, Object type) {
		if (isFactoryForType(type)) {
			Object adapter = super.adapt(object, type);
			if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter))) {
				return adapter;
			}
		}

		return null;
	}

	/**
	 * This adds a listener.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void addListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.addListener(notifyChangedListener);
	}

	/**
	 * This removes a listener.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void removeListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.removeListener(notifyChangedListener);
	}

	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void fireNotifyChanged(Notification notification) {
		changeNotifier.fireNotifyChanged(notification);

		if (parentAdapterFactory != null) {
			parentAdapterFactory.fireNotifyChanged(notification);
		}
	}

	/**
	 * This disposes all of the item providers created by this factory. 
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void dispose() {
		if (diagramItemProvider != null) diagramItemProvider.dispose();
		if (sceneItemProvider != null) sceneItemProvider.dispose();
		if (utteranceItemProvider != null) utteranceItemProvider.dispose();
		if (brtUtteranceItemProvider != null) brtUtteranceItemProvider.dispose();
		if (systemProcessItemProvider != null) systemProcessItemProvider.dispose();
		if (ubiquitousAccessItemProvider != null) ubiquitousAccessItemProvider.dispose();
		if (openingPointItemProvider != null) openingPointItemProvider.dispose();
		if (closingPointItemProvider != null) closingPointItemProvider.dispose();
		if (sketchItemProvider != null) sketchItemProvider.dispose();
	}

}
